//import { NewObjectMenuTemplate } from "../menu/NewObjectMenuTemplate";
import { AICore } from "./AICore";
import { getChildByName, getCompByType } from "./ObjectAndPropDesc";

export enum IDEModule{
    Camera = '摄像机',
    AssetsMgr = '资源管理',
    SceneData = '场景数据',
    CurObject = '当前对象',
    IDE = 'IDE',    //导出，截屏之类
    NO = 'no'
}

export class CmdIntent{
    moduleID:IDEModule; //摄像机操作，场景数据操作，资源管理
    cmd:string;
    args:{[key:string]:any}
}

class wordVec{
    情绪=0; //>0是正面，<0是负面。 好,坏，哈哈，不错，不好，不行，不对，不
    create=0;   //1表示创建,-1表示删除。 这个有值的时候，modify也要有值
    modiy=0;    //1表示位置。 2，朝向，不是0的话，则一定有隐含的需要修改的东西，这时候需要找到这个对象
    dir=0;      //方向，从1开始，前后左右上下
    numberValue=NaN;    //有值的话，就是一个表示数字的
    entity:string=null;   //实体名称
    提到我=0;   //你好，就提到我为1
    打招呼=0;   //hi，打招呼为1
    求助=0;
    肯定=0;     //<0表示否定
}


/**
 * 直接处理简单命令
 */
export class ShortCmd{
    private _createObjCmd = /^(创建|新建|建|建立|创立|做|来|创)(一个|个)?(盒子|box|Box|方块|球|sphere|Sphere|片|面|面片|片儿|面片儿)/;
    static oks = ['yes', 'ok', '好', '好吧', '是', '确定', '可以', '行', '嗯'];
    static rej = ['no', 'nono', '不', '不行', '不可以', '不好', '不是', '否', '不要', '不用', '不用了','别'];
    static cancel = ['cancel', '取消', '算了', '不要了', '终止', '停止', 'abort'];
    static help=['?','？','help','帮助','文档','说明','介绍自己','介绍一下','介绍一下你自己']

    static weatherTmp = ['天气'];
    static rainTmp = ['下雨'];

    /** 最近提到的对象，0优先级最高，每次提到都会提到0, 例如提到摄像机，然后说恢复，就是指恢复摄像机 */
    private _recentObj = [IDEModule.Camera,IDEModule.NO,IDEModule.NO,IDEModule.NO];

    async cmd(msg:string, ai:AICore){
        let retVec = new wordVec();

        if(msg=='聚焦'){
            let value = null;
            let select = (window as any).Editor.scene.getSelection()[0];
            if (select) {
                value = select.id;
            }
            Editor.scene.runScript('AI_CameraCtrl', '聚焦', value);
            return true;
        } 
        if(msg=='恢复摄像机'){
            return true;
        } 
        if (msg == '天空盒') {
            Editor.scene.runScript('AI_CameraCtrl', 'viewsky', '');
            //this._curConsensus.data.currentObject = '天空盒';
            //选中Scene3D
            Editor.scene.setSelection(Editor.scene.rootNode.children[0], 'node');
            return true;
        }        
        
        //先找出是否有数字
        let num = /\d+(\.\d+)?/.exec(msg);
        if (num) {
            retVec.numberValue = parseFloat(num[0]);
        }

        //TODO 当不认识的占比较多，就不再处理了

        /^(前进|前移|前|qianjin)/.test(msg) && (retVec.modiy = 1, retVec.dir=1);
        /^(后退|后移|后|houtui)/.test(msg) && (retVec.modiy = 1, retVec.dir=2);
        /^(左移|左)/.test(msg) && (retVec.modiy = 1, retVec.dir=3);
        /^(右移|右)/.test(msg) && (retVec.modiy = 1, retVec.dir=4);
        /^(上移|上|上升)/.test(msg) && (retVec.modiy = 1, retVec.dir=5);
        /^(下移|下|下降)/.test(msg) && (retVec.modiy = 1, retVec.dir=6);
        /^(左转)/.test(msg) && (retVec.modiy = 2, retVec.dir=3);
        /^(右转)/.test(msg) && (retVec.modiy = 2, retVec.dir=4);
        /^(上转)/.test(msg) && (retVec.modiy = 2, retVec.dir=5);
        /^(下转)/.test(msg) && (retVec.modiy = 2, retVec.dir=5);

        /^(谢谢|thanks)/.test(msg)&& (retVec.情绪 = 1, retVec.提到我=1, retVec.肯定=1);

        // let idx = this._camCtrlCmds.indexOf(msg);
        // if (idx >= 0) {
        //     return true;
        // }

        let createCmd = this._createObjCmd.exec(msg);
        if (createCmd) {
            //恢复天空盒视角
            // if (this._isViewSky) {
            //     this._isViewSky = false;
                Editor.scene.runScript('AI_CameraCtrl', 'viewsky_restore', '');
                //等待执行完成
                //await delay(1000)
            //}

            let type = createCmd[3];
            if (type == '盒子' || type == 'box' || type == 'Box') type = 'Cube'
            if (type == '球' || type == 'sphere' || type == 'Sphere') type = 'Sphere'
            if (type == '片' || type == '面' || type == '面片') type = 'Plane'

            //NewObjectMenuTemplate.createObject(type, null);
            if (type == '片') {
                //面向摄像机
            }

            return true;
        }

        // 临时的控制天气用的
        // demo start
        // if (this.weatherCtrlTmp.iscmd_weather(msg)) {
        //     //注意先要恢复
        //     //this._isViewSky=true;
        //     //Editor.scene.runScript('AI_CameraCtrl','viewsky','');
        //     return true;

        // } else if (this.weatherCtrlTmp.iscmd_rain(msg)) {
        //     let scene3d = Editor.scene.rootNode.children[0];
        //     // 设置雾的参数
        //     // fogStart, fogEnd, fogMode:0线性，1指数，2指数平方, fogColor:{_$type:'Color',r:0,g:0,b:0,a:0}, enableFog:true
        //     scene3d.props.enableFog = true;
        //     scene3d.props.fogColor = { _$type: "Color", r: 0.6, g: 0.6, b: 0.6 }
        //     scene3d.props.fogStart = 1;
        //     scene3d.props.fogEnd = 50;

        //     //找到粒子对象，设置启用，设置参数
        //     let rainobj = await getChildByName(scene3d, 'Rain', true);
        //     // 选中
        //     Editor.scene.setSelection(rainobj, 'node');
        //     Editor.scene.syncNode(rainobj);

        //     let particleRenderer = await getCompByType(rainobj, 'ShurikenParticleRenderer', false, false, false);
        //     particleRenderer.props._particleSystem.emission.enable = true;
        //     //particleRenderer.props._particleSystem.emission.emissionRate=1000;

        //     // 设置主光源的参数
        //     //let lightCom = await getCompByType(scene3d, 'DirectionLightCom',false,true,true);
        //     //Editor.scene.syncNode(lightobj);
        //     //lightCom.props.intensity = 0.1;

        //     return true;
        // } else if (this.weatherCtrlTmp.iscmd_stop_rain(msg)) {
        //     let scene3d = Editor.scene.rootNode.children[0];
        //     // 设置雾的参数
        //     // fogStart, fogEnd, fogMode:0线性，1指数，2指数平方, fogColor:{_$type:'Color',r:0,g:0,b:0,a:0}, enableFog:true
        //     scene3d.props.enableFog = false;

        //     //找到粒子对象，设置启用，设置参数
        //     let rainobj = await getChildByName(scene3d, 'Rain', true);
        //     // 选中
        //     Editor.scene.setSelection(rainobj, 'node');
        //     Editor.scene.syncNode(rainobj);

        //     let particleRenderer = await getCompByType(rainobj, 'ShurikenParticleRenderer', false, false, false);
        //     particleRenderer.props._particleSystem.emission.enable = false;
        //     return true;
        // }
        // demo end
        return false;
    }

    static isYes(cmd: string) {
        if (ShortCmd.oks.indexOf(cmd) >= 0) {
            return true
        }
        return false;
    }

    static isNo(cmd: string) {
        if (ShortCmd.rej.indexOf(cmd) >= 0) {
            return true;
        }
        return false;
    }

    static isCancel(cmd: string) {
        if (ShortCmd.cancel.indexOf(cmd) >= 0) {
            return true;
        }
        return false;
    }

    static includes(cmd:string, cmds:string[]){
        for(let i=0,len=cmds.length;i<len;i++){
            if(cmd.indexOf(cmds[i])>=0){
                return true;
            }
        }
        return false;
    }

}